/*
 * 
 * 
 * 
 */
package com.hboxs.asl.service;

import com.hboxs.asl.Page;
import com.hboxs.asl.Pageable;
import com.hboxs.asl.entity.Admin;
import com.hboxs.asl.entity.Category;
import com.hboxs.asl.entity.Member;
import com.hboxs.asl.qcloudLVB.entity.Live;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * Service - 会员
 */
public interface MemberService extends BaseService<Member, Long> {

    /**
     * 通过token查找Member
     *
     * @param token
     * @return
     */
    Member findByToken(String token);

    /**
     * 通过token查找Member(不验证日期)
     *
     * @param token
     * @return
     */
    Member findByToken2(String token);

    /**
     * 根据clientId查找会员
     *
     * @param clientId
     * @return
     */
    Member findByClientId(String clientId);

    /**
     * 根据推荐码查找会员
     *
     * @param code
     * @return
     */
    Member findByCode(String code);

    /**
     * 判断用户名是否存在
     *
     * @param username 用户名(忽略大小写)
     * @return 用户名是否存在
     */
    boolean usernameExists(String username);

    /**
     * 判断用户名是否禁用
     *
     * @param username 用户名(忽略大小写)
     * @return 用户名是否禁用
     */
    boolean usernameDisabled(String username);

    /**
     * 判断E-mail是否存在
     *
     * @param email E-mail(忽略大小写)
     * @return E-mail是否存在
     */
    boolean emailExists(String email);

    /**
     * 判断E-mail是否唯一
     *
     * @param previousEmail 修改前E-mail(忽略大小写)
     * @param currentEmail  当前E-mail(忽略大小写)
     * @return E-mail是否唯一
     */
    boolean emailUnique(String previousEmail, String currentEmail);

    /**
     * 判断手机号码是否存在
     *
     * @param phone 手机号码
     * @return E-mail是否存在
     */
    boolean phoneExists(String phone);

    /**
     * 保存会员
     *
     * @param member   会员
     * @param operator 操作员
     */
    void save(Member member, Admin operator);

    /**
     * 更新会员
     *
     * @param member        会员
     * @param modifyPoint   修改积分
     * @param modifyBalance 修改余额
     * @param depositMemo   修改余额备注
     * @param operator      操作员
     */
    void update(Member member, BigDecimal modifyPoint, BigDecimal modifyBalance, String depositMemo, Admin operator);

    /**
     * 根据用户名查找会员
     *
     * @param username 用户名(忽略大小写)
     * @return 会员，若不存在则返回null
     */
    Member findByUsername(String username);

    /**
     * 根据E-mail查找会员
     *
     * @param email E-mail(忽略大小写)
     * @return 会员，若不存在则返回null
     */
    List<Member> findListByEmail(String email);

    /**
     * 根据clientId查找会员
     * @param clientId
     * @return
     */
    List<Member> findListByClientId(String clientId);

    /**
     * 查找会员消费信息
     *
     * @param beginDate 起始日期
     * @param endDate   结束日期
     * @param count     数量
     * @return 会员消费信息
     */
    List<Object[]> findPurchaseList(Date beginDate, Date endDate, Integer count);

    /**
     * 判断会员是否登录
     *
     * @return 会员是否登录
     */
    boolean isAuthenticated();

    /**
     * 获取当前登录会员(session机制,网页)
     *
     * @return 当前登录会员，若不存在则返回null
     */
    Member getCurrent();

    /**
     * 获取当前登录会员(token机制,手机应用)
     *
     * @return 当前登录会员，若不存在则返回null
     */
    Member getCurrentByToken();

    /**
     * 获取当前登录用户名
     *
     * @return 当前登录用户名，若不存在则返回null
     */
    String getCurrentUsername();

    /**
     * 找到用户的下级
     * @param pageable
     * @param member
     * @return
     */
    Page<Member> findChildrenPage(Pageable pageable, Member member);

    /**
     * 找到用户的所有下级
     * @param member
     * @return
     */
    List<Member> findAllChildren(Member member);

    /**
     * 获取所有老师
     * @param teacher
     * @return
     */
    List<Member> findALLTeacher(Member.Type teacher);

    /**
     * 根据分类获取老师
     * @param pageable
     * @param category
     * @return
     */
    Page<Member> findTeacherByCategory(Pageable pageable, Category category);

    /**
     * 搜索老师
     * @param pageable
     * @param name
     * @return
     */
    Page<Member> searchTeacherPage(Pageable pageable, String name);

    /**
     * 获取所有关注的老师
     * @param pageable
     * @param member
     * @return
     */
    Page<Member> findPageTeacher(Pageable pageable, Member member);

    /**
     * 获取粉丝
     * @param pageable
     * @param teacher
     * @return
     */
    Page<Member> findPageFans(Pageable pageable, Member teacher);

    /**
     * 获取所有观看过该视频的用户
     * @param pageable
     * @param live
     * @return
     */
    Page<Member> findPageLive(Pageable pageable, Live live);
}